package org.oppoweb.emf.ecore
{
  /**
   * Internal API implemented by all features. 
   */
  public interface ESFInternal extends EStructuralFeature, InternalEObject
  {

    /**
     * Returns the delegate for this feature.
     * A default delegate implementation should always be available,
     * so this should never return <code>null</code>.
     * @return the delegate for this feature.
     */
    function getSettingDelegate():SettingDelegate;

    /**
     * Sets the specialized delegate for this feature.
     * @param settingDelegate the specialized delegate.
     */
    function setSettingDelegate(settingDelegate:SettingDelegate):void;

    /**
     * Returns whether the type is a feature map.
     * @return whether the type is a feature map.
     */
    function isFeatureMap():Boolean;

    /**
     * Returns the appropriately behaving feature map entry for this feature.
     * @return the feature map entry prototype.
     */
    function FeatureMap.Entry.Internal getFeatureMapEntryPrototype();

    /**
     * Sets the appropriately behaving feature map entry for this feature.
     * @param prototype the feature map entry prototype.
     */
    function setFeatureMapEntryPrototype(FeatureMap.Entry.Internal prototype):void;
    
    /**
     * Returns whether this is an {@link EAttribute attribute} that is an {@link EAttribute#isID() ID}.
     * @return whether this is an attribute that is an ID.
     */
    function isID():Boolean;

    /**
     * Returns whether this is a {@link EReference reference} that {@link EReference#isResolveProxies() resolves proxies}.
     * @return whether this is a reference that resolves proxies.
     */
    function isResolveProxies():Boolean;

    /**
     * Returns whether this is a {@link EReference reference} that is a {@link EReference#isContainer() container}.
     * @return whether this is a reference that is a container. 
     */
    function isContainer():Boolean;

    /**
     * Returns whether this is a {@link EReference reference} that is a {@link EReference#isContainment() containment}.
     * @return whether this is a reference that is a containment.
     */
    function isContainment():Boolean;

    /**
     * Returns the {@link EReference#getEOpposite() opposite} if this is {@link EReference reference} that has one.
     * @return the opposite if this is reference that has one.
     */
    function getEOpposite():EReference;
  }
}